#pragma once

#include "noncopyable.h"
#include "Timestamp.h"


#include <vector>
#include <unordered_map>

class Channel;
class EventLoop;


// 多路事件分发器的核心 : IO多路复用模块
class Poller : noncopyable
{
public:
    using ChannelList = std::vector<Channel*>;

    Poller(EventLoop* loop);
    virtual ~Poller() = default;

    // 给继承自此类的IO多路复用的类提供统一的接口
    virtual Timestamp poll(int timeoutMs, ChannelList* activeChannels) = 0;
    virtual void updateChannel(Channel* channel) = 0;
    virtual void removeChannel(Channel* channel) = 0;

    // 判断参数Channel是否在当前Poller中
    bool hasChannel(Channel* channel) const;

    // EventLoop可通过此接口获取默认的IO复用的具体实现  Poll/Epoll
    //（该静态函数在一个公共的文件中实现，这样可以防止基类对象在实现此函数引用不必要的派生类的头文件）
    static Poller* newDeafaultPoller(EventLoop* loop);

protected:
    // map的key : sockfd    value : sockfd所属的Channel通道
    using ChannelMap = std::unordered_map<int, Channel*>;
    ChannelMap m_channelList;

private:
    EventLoop* m_ownerLoop; // Poller所属的事件循环EventLoop
};